if (typeof(own) === 'undefined') {
    var own = {};
}
if (!Object.keys) {
    Object.keys = function (obj) {
        var keys = [],
            k;
        for (k in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, k)) {
                keys.push(k);
            }
        }
        return keys;
    };
}
own.util = {
    /**
     * 深度复制、合并对象
     *
     * @param target
     * @param obj
     * @returns {*|{}} 返回合并后的对象
     */
    copy: function (target, obj) {
        var target = target || {};
        for (var i in obj) {
            // if (typeof obj[i] == 'object') {
            //     try{
            //         target[i] = (obj[i].constructor === Array) ? [] : {};
            //         own.util.copy(target[i], obj[i]);
            //     }catch (e){
            //         target[i] = obj[i];
            //     }
            // } else {
            //     target[i] = obj[i];
            // }
            target[i] = obj[i];
        }
        return target;
    },
    /**
     * 获取字符串的hashcode值
     * @param str
     * @returns {number}
     */
    hashCode: function (str) {
        var hash = 0;
        if (str.length == 0) return hash;
        for (i = 0; i < str.length; i++) {
            char = str.charCodeAt(i);
            hash = ((hash << 5) - hash) + char;
            hash = hash & hash;
        }
        return hash;
    },
    /**
     * 去除字符串左右空格
     * @param str
     * @returns {string | void}
     */
    trim: function (str) {
        return str.replace(/(^\s*)|(\s*$)/g, "");
    },
    /**
     * 执行ajax请求
     * @param opt
     */
    ajax: function (opt) {
        var def = own.util.copy({
            url: '',

            data: {},
            /**
             * 提交方式：POST、GET等，默认POST
             */
            method: 'POST',
            /**
             * 请求方式，默认"application/x-www-form-urlencoded"
             */
            contentType: "application/x-www-form-urlencoded",
            /**
             * 头部请求设置
             */
            heads: {},
            /**
             * 是否同步 true：异步 false同步，默认是同步
             */
            sync: true,
            /**
             * 返回data数据类型：json、text、html
             */
            dataType: 'json',
            /**
             * 回调函数
             * @param a 成功或者失败
             * @param b 返回值
             */
            fun: function (a, b) {
            }
        }, opt);

        var xmlHttpRequest = own.util._createXMLHTTPRequest(xmlHttpRequest);
        if (!xmlHttpRequest) {
            console.error("创建ajax请求对象失败：xmlHttpRequest错误");
            return;
        }
        xmlHttpRequest.onreadystatechange = function () {
            var status = xmlHttpRequest.readyState;
            if (status == 4) {
                if (xmlHttpRequest.status == 200) {
                    if (def.dataType == 'json') {
                        try {
                            def.fun(true, JSON.parse(xmlHttpRequest.responseText));
                        } catch (e) {
                            console.error("json转换出现错误：", e);
                            def.fun(false);
                        }
                    } else if (def.dataType == 'text') {
                        def.fun(true, xmlHttpRequest.responseText);
                    } else if (def.dataType == 'html') {
                        def.fun(true, xmlHttpRequest.responseText);
                    } else if (def.dataType == 'xml') {
                        def.fun(true, xmlHttpRequest.responseXML);
                    } else {
                        console.error("错误的定义dataType");
                        def.fun(false, status, xmlHttpRequest.status);
                    }
                } else {
                    def.fun(false, status, xmlHttpRequest.status);
                }
            } else {

            }
        };
        xmlHttpRequest.open(def.method, def.url, def.sync);
        xmlHttpRequest.setRequestHeader("Content-Type", def.contentType);

        // xmlHttpRequest.send("username=" + userName);

        xmlHttpRequest.send(null);
    },
    _createXMLHTTPRequest: function (xmlHttpRequest) {
        if (window.XMLHttpRequest) {
            //针对FireFox，Mozillar，Opera，Safari，IE7，IE8
            xmlHttpRequest = new XMLHttpRequest();
            //针对某些特定版本的mozillar浏览器的BUG进行修正
            if (xmlHttpRequest.overrideMimeType) {
                xmlHttpRequest.overrideMimeType("text/xml");
            }
        } else if (window.ActiveXObject) {
            //针对IE6，IE5.5，IE5
            //两个可以用于创建XMLHTTPRequest对象的控件名称，保存在一个js的数组中
            //排在前面的版本较新
            var activexName = ["MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
            for (var i = 0; i < activexName.length; i++) {
                try {
                    //取出一个控件名进行创建，如果创建成功就终止循环
                    //如果创建失败，回抛出异常，然后可以继续循环，继续尝试创建
                    xmlHttpRequest = new ActiveXObject(activexName[i]);
                    break;
                } catch (e) {
                }
            }
        }

        //确认XMLHTtpRequest对象是否创建成功
        if (!xmlHttpRequest) {
            return false;
        } else {
            return xmlHttpRequest;
        }
    },
    /**
     * 根据表达式进行选择对象
     */
    selectAll:function(obj){
        return document.querySelectorAll(obj);
    },
    /**
     * 根据表达式进行选择对象
     */
    select:function(obj){
        return document.querySelector(obj);
    },
    /**
     * 是否空值，null,undefined,'' 都是空值
     */
    isEmpty:function(obj){
        obj = own.util.trim(obj);
        if(obj == undefined || obj == null || obj == ''){
            return true;
        }
        return false;
    },
    /**
     * 获取子节点
     *
     * @param obj 对象
     */
    getChildNodes:function(obj){
        if(typeof(obj) == 'string'){
            obj = document.querySelector(obj);
        }
        var result = [];
        var b = obj.childNodes;
        for(var i=0; i<b.length;i++){
            if(b[i].nodeName == "#text" && !/\s/.test(b.nodeValue)){
                // obj.removeChild(b[i]);
            }else{
                result.push(b[i]);
            }
        }
        return result;
    },
    /**
     * 字符串转换成html
     * @param arg
     * @returns {NodeList}
     */
    parseDom:function(arg){
        var objE = document.createElement("div");
        objE.innerHTML = arg;
        return own.util.getChildNodes(objE);
    },
    /**
     * // 对Date的扩展，将 Date 转化为指定格式的String
     // 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符，
     // 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
     // 例子：
     var format = "yyyy-MM-dd";
     if(ops.type == 'date'){
                        format ="yyyy-MM-dd";
                    }else if(ops.type == 'year'){
                        format ="yyyy";
                    }else if(ops.type == 'month'){
                        format ="yyyy-MM";
                    }else if(ops.type == 'time'){
                        format ="hh:mm:ss";
                    }else if(ops.type == 'datetime'){
                        format ="yyyy-MM-dd hh:mm:ss";
                    }
     * @param date
     * @param fmt
     * @returns {*}
     */
    format:function(date,fmt){
        var o = {
            "M+": date.getMonth() + 1, //月份
            "d+": date.getDate(), //日
            "h+": date.getHours(), //小时
            "m+": date.getMinutes(), //分
            "s+": date.getSeconds(), //秒
            "q+": Math.floor((date.getMonth() + 3) / 3), //季度
            "S": date.getMilliseconds() //毫秒
        };
        if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
        for (var k in o)
            if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
        return fmt;
    }
};
window.$All = own.util.selectAll;
window.$s = own.util.select;